

let e: boolean | string | null | number = null;

interface Istate1 {
    name: string,
    age: number,
    sex: number,
}
const obj: Istate1 = {
    name: 'zkl',
    age: 18,
    sex: 1,
}
// 可选属性
interface Istate2 {
    name: string;
    age?: number;
}
const obj2: Istate2 = {
    name: "张三",
    age: 18
}
interface Istate3 {
    name: string | number;
    age?: number;
    [propName: string]: any;
}

const obj33: Istate3 = {
    name: 'Jay',
    age: 20,
    sex: 'men',
    isMary: false
}

interface Istate4 {
    name: string;
    readonly age: number;
}

const arr1: number[] = [1, 2, 3, 4, 5];
const arr2: string[] = ['1', '2', '3', '4', '5'];
const arr3: boolean[] = [true, false, false];

const arr4: Array<number> = [1, 2, 3,];
const arr5: Array<string> = ['1', '2', '3',];
const arr6: Array<any> = [1, '2', true, 3,];

const arr7: Array<Istate1> = [
    {
        name: 'zzz',
        age: 18,
        sex: 1
    }
]

const arr8: Istate2[] = [
    {
        name: 'aaa',
        age: 18,
    }
]

function funType(name: string, age: number): number {
    return age;
}

function funType2(name: string, age: number, sex?: string): number {
    return age;
}
function funType3(name = "Tom", age = 18): string {
    return name;
}
function funType4(name: string, age: number): number {
    return age;
}
const funType5: (name: string, age: number) => number = function (name: string, age: number): number {
    return age;
}

// 定义函数的 接口类型
interface IfunType6 {
    (name: string, age: number): number;
}

const funType6: IfunType6 = function (name: string, age: number): number {
    return age;
}


function getValue(value: number | string): number | string {
    return value;
}

// 8、Typescript类型断言：

// 类型断言可以用来手动指定一个值的类型。

// 语法：<类型>值或者值 as 类型。

let res = 100 as any;
res = 'helloe'


// 9、Typescript类型别名：

// 类型别名可以用来给一个类型起一个新名字。

// 采用关键字，比如“type name = string | number”。

type strType1 = string | number | boolean;

// 对于接口也可以采用类型别名
interface MuchType1 {
    name: string;
}

interface MuchType2 {
    age: number;
}

type MuchType = MuchType1 | MuchType2;


// 限制字符串的选择
type sex = "男" | "女";


// 10、Typescript枚举：

// 枚举（enum）类型用于取值被限定在一定范围内的场景。


// 使用枚举可以定义一些有名字的数字常量
enum Days {
    Sun,
    Mon,
    Tue,
    Wed,
    Thu,
    Fri,
    Sat
}

enum Sexs {
    Man,
    Woman
}

// enum Months{
//     1月,
//     2月,
// }

// 11、Typescript类的装饰符：

// public、private和protected。
// public 公有变量
// private 私有变量
// protected 受保护的变量 


class Comments {
    constructor(
        public id: number,
        public title: string,
        public comment: string,
        public author: string,
    ) {

    }
}

let comments: Array<Comments> = [
    new Comments(1, 'H', "Hello", "ZKL")
]



// 12、Typescript泛型： T 
// 泛型是指在定义函数、接口或类的时候，不预先指定具体类型，而是在使用的时候再指定类型的一种特性。


// 函数中使用泛型
function createArr<t>(length: number, value: t): Array<t> {
    const arr: Array<t> = [];
    for (let i = 0; i < length; i++) {
        arr[i] = value;
    }

    return arr;
}

const strArr = createArr(10, 'likes')

const strArr2 = createArr(5, 100)

// 接口当中使用泛型
interface Icreate {
    <T>(name: string, value: T): Array<T>;
}